import { ElMessage } from 'element-plus';

/**
 * 通用复制功能
 * @param content 要复制的内容
 * @param el 可选的DOM元素，用于降级复制
 * @returns Promise<boolean> 复制是否成功
 */
export const copyHandle = async (content = "", el?: HTMLElement): Promise<boolean> => {
  if (!content) {
    ElMessage.warning("没有可复制内容");
    return false;
  }

  // 仅在 https 或 localhost 下尝试 Clipboard API
  const isSecure = window.isSecureContext || /^localhost(:\d+)?$/.test(location.hostname);
  
  if (navigator.clipboard && isSecure) {
    try {
      await navigator.clipboard.writeText(content);
      ElMessage.success("复制成功");
      return true;
    } catch (err) {
      console.warn('Clipboard API 复制失败，降级到其他方式:', err);
      // 失败则降级
    }
  }

  // 兼容 http 协议和老浏览器
  const textarea = document.createElement("textarea");
  textarea.value = content;
  textarea.setAttribute("readonly", "");
  textarea.style.position = "fixed";
  textarea.style.top = "-9999px";
  textarea.style.left = "-9999px";
  textarea.style.opacity = "0";
  
  document.body.appendChild(textarea);
  textarea.select();
  textarea.setSelectionRange(0, content.length);

  try {
    const successful = document.execCommand("copy");
    document.body.removeChild(textarea);
    
    if (successful) {
      ElMessage.success("复制成功");
      return true;
    }
  } catch (e) {
    console.warn('execCommand 复制失败:', e);
    document.body.removeChild(textarea);
    // 失败则降级
  }

  // 最后降级：手动选择内容
  try {
    if (el) {
      const range = document.createRange();
      range.selectNodeContents(el);
      const selection = window.getSelection();
      if (selection) {
        selection.removeAllRanges();
        selection.addRange(range);
        ElMessage.info("内容已选中，请手动复制 (Ctrl+C)");
        return true;
      }
    }
  } catch (e) {
    console.warn('手动选择失败:', e);
  }

  ElMessage.error("自动复制失败，请手动复制");
  return false;
};

/**
 * 复制代码块内容
 * @param codeElement 代码块DOM元素
 * @returns Promise<boolean> 复制是否成功
 */
export const copyCodeBlock = async (codeElement: HTMLElement): Promise<boolean> => {
  const content = codeElement.textContent || codeElement.innerText || "";
  return await copyHandle(content, codeElement);
};

/**
 * 复制Markdown内容（去除格式）
 * @param markdownContent Markdown内容
 * @returns Promise<boolean> 复制是否成功
 */
export const copyMarkdownAsText = async (markdownContent: string): Promise<boolean> => {
  // 简单的Markdown格式清理
  const plainText = markdownContent
    .replace(/#{1,6}\s+/g, '') // 移除标题标记
    .replace(/\*\*(.*?)\*\*/g, '$1') // 移除粗体标记
    .replace(/\*(.*?)\*/g, '$1') // 移除斜体标记
    .replace(/`(.*?)`/g, '$1') // 移除行内代码标记
    .replace(/```[\s\S]*?```/g, (match) => {
      // 保留代码块内容，但移除标记
      return match.replace(/```\w*\n?/g, '').replace(/```$/g, '');
    })
    .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') // 移除链接格式，保留文本
    .replace(/^\s*[-*+]\s+/gm, '• ') // 将列表标记转换为项目符号
    .replace(/^\s*\d+\.\s+/gm, (match, offset, string) => {
      // 保持有序列表的数字
      const lineStart = string.lastIndexOf('\n', offset) + 1;
      const lineNum = string.substring(0, offset).split('\n').length;
      return `${lineNum}. `;
    });

  return await copyHandle(plainText.trim());
};
